package com.itheima.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.common.R;
import com.itheima.entity.Employee;
import com.itheima.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmloyeeController {

    @Autowired
    private EmployeeService employeeService;

    /*
     * 此处定义一个登录系统
     * */
//   此处通过前端页面得知：此处是通过post请求，传输的是JSON数据
    @PostMapping("/login")
//    此处request用于后续的回显操作
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) {
        /*
        * 处理逻辑如下：
        ①. 将页面提交的密码password进行md5加密处理, 得到加密后的字符串
        ②. 根据页面提交的用户名username查询数据库中员工数据信息
        ③. 如果没有查询到, 则返回登录失败结果
        ④. 密码比对，如果不一致, 则返回登录失败结果
        ⑤. 查看员工状态，如果为已禁用状态，则返回员工已禁用结果
        ⑥. 登录成功，将员工id存入Session, 并返回登录成功结果
        *
        * */

//        ①. 将页面提交的密码password进行md5加密处理, 得到加密后的字符串
        String password = employee.getPassword();//此处的employee已经封装到了对应的同名实体类中
        password = DigestUtils.md5DigestAsHex(password.getBytes());

//        ②. 根据页面提交的用户名username查询数据库中员工数据信息
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
//        此处进行一个等值查询左边的数据库数值，与右边传输的数值进行比对,找当相同的数据
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
//        使用业务层方法接收该数据，并对它进行解析操作
        Employee emp = employeeService.getOne(queryWrapper);

//         ④. 密码比对，如果不一致, 则返回登录失败结果
        if (emp == null) {
            return R.error("登录失败");
        }
        if (!emp.getPassword().equals(password)) {
            return R.error("登录失败");
        }
//        ⑤. 查看员工状态，如果为已禁用状态，则返回员工已禁用结果
        if (emp.getStatus() == 0) {
            return R.error("账号已经禁用");
        }

//        ⑥. 登录成功，将员工id存入Session, 并返回登录成功结果
        request.getSession().setAttribute("employee", emp.getId());

        return R.success(emp);
    }


    //    此处设置一个退出的方法
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request) {
//        清理session中的信息
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    }


    //此处设置一个新增员工的方法
//    根据前端的要求,此处使用要创建一个POST请求,
    @PostMapping
    public R<String> save(@RequestBody Employee employee, HttpSession session) {
//        通过页面调试可以得知,前端传送的是一个JSON对象,需要对JSON进行解析操作
//         此处通过断点调试可以看到,password,status,time,user都是是没有信息的,
//        这些内容都需要进行补充,密码在前端是不显示的,因此需要设置一个默认密码
//        status数据库中本身默认就是1,因此也不需要进行修改
        log.info("查看新增信息{}", employee.toString());

//        添加默认密码,注意加密
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
//        添加创建时间和修改时间
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());

//       添加创建人和修改人
//        获取Seccion中的用户ID
//        Long id = (Long) session.getAttribute("employee");
////        employee.setCreateUser(id);
//        employee.setCreateUser(1l);
////        employee.setUpdateUser(id);
//        employee.setUpdateUser(1l);

//        调用业务层方法
        employeeService.save(employee);
//        向前端返回成功信息
        return R.success("添加成功");

    }


//    此处创建分页查询方法
//    此处使用MybatisPlus的分页方法Page
//    该方法包含总记录数和条数
//    该方法除了包含分页查询,还整合了模糊查询
//    前端发送的是Get方法路径是/page

    /**
     * 员工信息分页查询
     *
     * @param page     当前查询页码
     * @param pageSize 每页展示记录数
     * @param name     员工姓名 - 可选参数
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name) {
//        此处测试看看能不能接收到数据
//        此处分页查询和模糊查询走的是同一个方法
        log.info("page = {},pageSize={},name={}", page, pageSize, name);
        //A. 构造分页条件
//        内部传参:当前页和当前显示数量
        Page pageInfo = new Page<>(page, pageSize);
//        构造条件构造器
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        //B. 构建搜索条件 - name进行模糊匹配
        //StringUtils:字符串处理程序
        //isNotEmpty:不为空(条件)
//        当传输的name不为空时,则添加内容,如果为空则不添加
        wrapper.like(StringUtils.isNotEmpty(name), Employee::getName, name);
        //C. 构建排序条件 - 更新时间倒序排序
        wrapper.orderByDesc(Employee::getUpdateTime);

        //D. 执行查询
//        把分页构造器和条件查询放在方法中进行执行
        employeeService.page(pageInfo,wrapper);
        //E. 组装结果并返回

        return R.success(pageInfo);
    }

//    实现启用和禁用操作
//    从前端页面中可以得知:
//    请求类型是:PUT
//    请求体是:JSON
//    请求参数:id,status
//    请求路径/employee
//    前端接收的返回值是code 没有具体的数据

//    根据ID修改员工信息
    @PutMapping
    public R<String> update(@RequestBody Employee employee,HttpSession session){

//        前端发送的内容,id和status
//         Employee(id=1602963341129588700, username=null, name=null, password=null,
//         phone=null, sex=null, idNumber=null, status=0, createTime=null, updateTime=null,
//         createUser=null, updateUser=null)
        log.info("update"+employee.toString());
//        设置修改时间(现在的时间)
        employee.setUpdateTime(LocalDateTime.now());
//        设置修改人
//        获取seccion域
//        Long id = (Long) session.getAttribute("employee");
//        employee.setUpdateUser(id);
//        此处虽然是封装数据,但是MybatisPlus已经在底层处理过了
        employeeService.updateById(employee);
        return R.success("员工信息处理成功");
    }
//    创建修改员工的方法
//    功能一:首先要考虑回显,这里要配合前端操作,前端拿到数据后,返回到模型数组中,通过模型数组达到页面数据回显的效果
//    功能二:保存修改

//    前端是根据ID进行查询的,
//    请求类型Get
//    请求参数id
//    请求路径/employee
//    请求方式PathVariable
//    返回的类型是数据
    @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable Long id){
        Employee byId = employeeService.getById(id);
        log.info("getById:"+byId);
        return R.success(byId);
    }






}
